﻿// -------------------------------------------------------------------------
//    @FileName         :    NFPart.h
//    @Author           :    gaoyi
//    @Date             :    22-10-31
//    @Email			:    445267987@qq.com
//    @Module           :    NFPart
//
// -------------------------------------------------------------------------

#pragma once

#include "NFComm/NFCore/NFPlatform.h"
#include "NFComm/NFObjCommon/NFObject.h"
#include "NFComm/NFObjCommon/NFShmMgr.h"
#include "NFLogicCommon/NFLogicBindRpcService.h"
#include "NFComm/NFPluginModule/NFIMemMngModule.h"
#include "NFComm/NFObjCommon/NFSeqOP.h"
#include "NFComm/NFCore/NFTime.h"
#include "NFComm/NFObjCommon/NFObjPtr.h"
#include "NFPartModule.h"

struct RoleOne;

namespace proto_ff
{
    class CityRoleInfo;
    class Proto_CSGetRoleRsp;
    class Proto_RoleSimpleInfo;
    class tbRoleDetail;
}

class NFPlayer;

class NFPart : public NF_OBJECT_TEMPLATE_MACRO(NFPart, EOT_LOGIC_PART_ID, NFObject,  public NFSeqOP)
public:
    NFPart();

    virtual ~NFPart();

    int CreateInit();

    int ResumeInit();

public:
    //******************part调用接口******************
    /**
     * @brief 初始化part
     * @param pMaster
     * @param partType
     * @param dbData
     * @param bCreatePlayer
     * @return
     */
    virtual int Init(NFPlayer* pMaster, uint32_t partType);

    /**
     * @brief 释放part资源
     * @return
     */
    virtual int UnInit();

    /**
     * @brief 所有部件初始化完成
     * @return
     */
    virtual int OnInit() { return 0; }

public:
    /**
     * @brief 从数据库中加载数据
     * @param data
     * @return
     */
    virtual int LoadFromDB(const proto_ff::tbRoleDetail* pDBData) { return 0; }

    /**
     * @brief 从配置中初始化数据
     * @return
     */
    virtual int InitConfig(proto_ff::tbRoleDetail* pDbData, const RoleOne& stRoleOne) { return 0; }

    /**
     * @brief 存储DB部件入口
     * @param proto
     * @return
     */
    virtual int SaveDB(proto_ff::tbRoleDetail* pDBData) { return 0; }

    virtual int SaveRoleSimpleInfo(proto_ff::Proto_RoleSimpleInfo* pDbData) { return 0; }

    /**
     * @brief 注册后的初始化
     * @return
     */
    virtual int OnRegister() { return 0; }

    /**
     * @brief 登陆入口
     * @return
     */
    virtual int OnLogin() { return 0; }

    /**
     * @brief 登出入口
     * @return
     */
    virtual int OnLogout() { return 0; }

    /**
     * @brief 掉线入口
     * @return
     */
    virtual int OnDisconnect() { return 0; }

    /**
     * @brief 重连入口
     * @return
     */
    virtual int OnReconnect() { return 0; }

    ////////////////////////////////// 每日零点 每周一零点 刷新接口 ///////////////////////////////////
    /**
     * @brief 每日零点 刷新接口
     * @return
     */
    virtual int DayTick() { return 0; }

    /**
     * @brief 每日4/6点 刷新接口
     * @return
     */
    virtual int DayOtherTick() { return 0; }

    /**
     * @brief 每日零点 刷新接口
     * @return
     */
    virtual int WeekTick() { return 0; }

    /**
     * @brief 每月刷新接口
     * @return
     */
    virtual int MonthTick() { return 0; };

    /**
     * @brief 每秒定时回调
     * @return 0 表示成功，其他为错误码
     */
    virtual int SecTick() { return 0; }

    /**
     * @brief 每5秒定时回调
     * @return 0 表示成功，其他为错误码
     */
    virtual int FiveSecTick() { return 0; }

    /**
     * @brief 每分钟定时回调
     * @return 0 表示成功，其他为错误码
     */
    virtual int MinuteTick() { return 0; }

    /**
     * @brief 每5分钟定时回调
     * @return 0 表示成功，其他为错误码
     */
    virtual int FiveMinuteTick() { return 0; }

    /**
     * @brief 每小时定时回调
     * @return 0 表示成功，其他为错误码
     */
    virtual int HourTick() { return 0; }
public:
    /**
     * @brief update
     */
    virtual int LogicTick() { return 0; }

public:
    virtual int MakePlayerDataCS(proto_ff::Proto_CSGetRoleRsp* pCSGetRoleRsp);
    virtual int MakeCityPlayerData(proto_ff::CityRoleInfo* pGCCityRoleInfo);

public:
    /**
     * @brief 注册要处理的消息
     * @return
     */
    virtual int RegisterMessage();

public:
    /**
     * @brief 处理客户端消息
     * @param unLinkId
     * @param packet
     * @return
     */
    virtual int OnHandleClientMessage(uint32_t msgId, NFDataPackage& packet);

    /**
     * @brief 处理来自服务器的信息
     * @param unLinkId
     * @param packet
     * @return
     */
    virtual int OnHandleServerMessage(uint32_t msgId, NFDataPackage& packet);

public:
    /**
     * @brief
     * @param nMsgID
     * @param createCo
     * @return
     */
    virtual int RegisterClientMessage(uint32_t nMsgID, bool createCo = false);

    /**
     * @brief
     * @param nMsgID
     * @param createCo
     * @return
     */
    virtual int RegisterServerMessage(uint32_t nMsgID, bool createCo = false);

public:
    //部件类型
    uint32_t GetPartType() const { return m_partType; }
    void SetPartType(uint32_t partType) { m_partType = partType; }

    NFPlayer* GetPlayer();
    const NFPlayer* GetPlayer() const;

public:
    virtual uint32_t GetCurRoleDetailSeq() const;

    void SetNeedSave(bool save) { MarkDirty(); }

protected:
    int m_iPlayerObjId;
    uint64_t m_roleId;
    NFPlayer* m_pPlayer;
    uint32_t m_partType;
};
